package social.server.main;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

import social.server.Exceptions.NoActivitysException;
import social.server.historicActivity.HistoricActivity;
import social.server.ranking.RankedUser;

public class Windows {

	public static void main(String[] args) {
		try {
			start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void start() throws Exception {

		String opcao = null;
		Scanner sc = new Scanner(java.lang.System.in);

		do {
			java.lang.System.out.print("Bem vindo a nossa rede social\n"
					+ "Digite: \n" + "1- Para efetuar login\n"
					+ "2- Para  registrar-se\n" + "0- Para sair\n\n");
			opcao = sc.nextLine();

			if (opcao.equals("1")) {
				login();
			}

			else if (opcao.equals("2")) {
				cadastro();
			}

		} while (!opcao.equals("0"));

		java.lang.System.exit(0);

	}

	private static void login() {
		Scanner sc = new Scanner(java.lang.System.in);
		String opcao = "";
		do {
			java.lang.System.out.print("Digite seu login: ");
			String login = sc.nextLine();
			java.lang.System.out.print("");

			if (System.getInstance().authenticateUser(login)) {
				janelaUsuario(login);
				opcao = "0";
			} else {
				java.lang.System.out.println("Usuario invalido");
			}

		} while (!opcao.equals("0"));

	}

	private static void cadastro() {

		Scanner sc = new Scanner(java.lang.System.in);
		String nome;
		String login;
		String endereco = null;
		User usuario = null;

		do {
			java.lang.System.out.print("Digite seu nome: ");
			nome = sc.nextLine();
			java.lang.System.out.println("Digite o login Desejado: ");
			login = sc.nextLine();
			java.lang.System.out.println("Digite seu endereco: ");
			endereco = sc.nextLine();

			try {
				usuario = new User(login, nome, endereco);
				java.lang.System.out.println("Usuario cadastrado com sucesso");
				System.getInstance().addUser(usuario);
				start();
			} catch (Exception e) {
				java.lang.System.out.println(e.getMessage());
			}

		} while (usuario == null);
	}

	private static void janelaUsuario(String login) {
		String opcao = null;
		Scanner sc = new Scanner(java.lang.System.in);

		do {
			java.lang.System.out.print("\nDigite o que deseja visualizar: \n"
					+ "1 - Cadastrar Itens\n" 
					+ "2 - Localizar Usuario\n"
					+ "3 - Visualizar Perfil\n" 
					+ "4 - Pesquisar Itens\n"
					+ "5 - Ranking dos Usuarios\n"
					+ "6 - Requisicoes de amizade\n"
					+ "7 - Requisicoes de itens\n" 
					+ "8 - Desfazer Amizade\n"
					+ "9 - Remover Item\n" 
					+ "10 - Exibir Historico\n"
					+ "11 - Itens emprestados de amigos\n"
					+ "12 - Requisitar devoulucao de itens\n"
					+ "0 - Para sair\n\n");
			opcao = sc.nextLine();

			if (opcao.equals("1")) {
				cadastrarItens(login);
			} else if (opcao.equals("2")) {
				String palavraChave, atributo = "";
				int numeroDoAtributo = 0;

				Scanner sc1 = new Scanner(java.lang.System.in);
				java.lang.System.out.println("Palavra-Chave: ");
				palavraChave = sc1.nextLine();
				java.lang.System.out
						.println("Digite: 1 - Busca por nome\n2 - Busca por endereco\n\n");
				numeroDoAtributo = sc1.nextInt();

				if (numeroDoAtributo == 1) {
					atributo = "Nome";
				} else if (numeroDoAtributo == 2) {
					atributo = "Endereco";
				}
				localizarUsuario(login, palavraChave, atributo);
			} else if (opcao.equals("3")) {
				visualizarPerfil(login);
			} else if (opcao.equals("4")) {
				pesquisarItens(login);
			} else if (opcao.equals("5")) {
				rankingUsuarios(login);
			} else if (opcao.equals("6")) {
				amizadesPendentes(login);
			} else if (opcao.equals("7")) {
				aceitarRequisicoesDeItens(login);
			} else if (opcao.equals("8")) {
				desfazerAmizade(login);
			} else if (opcao.equals("9")) {
				removerItem(login);
			} else if (opcao.equals("10")) {
				exibirHistorico(login);
			} else if (opcao.equals("11")) {
				itensEmprestados(login);
			} else if (opcao.equals("11")) {
				requisitarDevolucao(login);
			}

		} while (!opcao.equals("0"));
	}

	private static void itensEmprestados(String login) {
		User usuario = null;
		Scanner sc = new Scanner(java.lang.System.in);
		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		for (int i = 0; i < usuario.getLoanList().size(); i++) {
			java.lang.System.out.println((i+1) + " - " +  usuario.getLoanList().get(i));
		}
		
		java.lang.System.out.println("Deseja devolver algum item? (S/N) ");
		String escolha = sc.nextLine();
		
		if (escolha.equalsIgnoreCase("s")) {
			java.lang.System.out.println("Qual o indice do item? ");
			int opcao = sc.nextInt();
			try {
				usuario.returnItem(usuario.getLoanList().get(opcao-1));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}

	private static void exibirHistorico(String login) {
		List<HistoricActivity> userHistoric = null;
		try {
			userHistoric = System.getInstance().getUser(login)
					.getUserHistoric();
			Iterator<HistoricActivity> it = userHistoric.iterator();

			while (it.hasNext()) {
				HistoricActivity activity = it.next();
				java.lang.System.out.println(activity.getActivity());
			}
		} catch (NoActivitysException e) {
			java.lang.System.out
					.println("Usuario nao possui atividades no historico");
		} catch (Exception e) {
		}
	}

	private static void pesquisarItens(String login) {

		List<Item> listaDeItensEncontrados = new ArrayList<Item>();

		String palavraChave = "", atributo = "", tipoDoSort = "", CriterioDoSort = "";
		int numeroDoAtributo, numeroDoTipoSort, numeroCriterioSort = 0;

		Scanner sc = new Scanner(java.lang.System.in);
		java.lang.System.out.println("Palvra-Chave: ");
		palavraChave = sc.nextLine();

		java.lang.System.out
				.println("Digite: 1 - Busca por nome\n2 - Busca por categoria\n3 - Busca por descricao");
		numeroDoAtributo = sc.nextInt();

		java.lang.System.out
				.println("Digite: 1 - Ordenacao crescente\n2 - Ordenacao decrescente");
		numeroDoTipoSort = sc.nextInt();

		java.lang.System.out
				.println("Digite: 1 - Criterio: Data de criacao\n2 - Criterio: Reputacao");
		numeroCriterioSort = sc.nextInt();

		if (numeroDoAtributo == 1)
			atributo = "nome";
		else if (numeroDoAtributo == 2)
			atributo = "categoria";
		else if (numeroDoAtributo == 3)
			atributo = "descricao";

		if (numeroDoTipoSort == 1)
			tipoDoSort = "crescente";
		else if (numeroDoTipoSort == 2)
			tipoDoSort = "decrescente";

		if (numeroCriterioSort == 1)
			CriterioDoSort = "dataCriacao";
		else if (numeroCriterioSort == 2)
			CriterioDoSort = "reputacao";

		try {
			listaDeItensEncontrados = System.getInstance().searchItem(
					System.getInstance().getUser(login).getIdSession(),
					palavraChave, atributo, tipoDoSort, CriterioDoSort);
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < listaDeItensEncontrados.size(); i++) {
			java.lang.System.out.println(i + 1 + " - "
					+ listaDeItensEncontrados.get(i));
		}

	}
	
	private static void requisitarDevolucao(String login){
		List<RequestItem> listaAux = new LinkedList<RequestItem>();
		List<RequestItem> lista = null;
		User usuario = null;
		int cont = 0;
		
		try {
			usuario = System.getInstance().getUser(login);
			lista = usuario.getInProgressRequestList();
		} catch (Exception e) {
			java.lang.System.out.println(e.getMessage());
			return;
		}
		
		for(int i = 0; i < lista.size(); i++){
			if(lista.get(i).getinProgressRequestStatus() && (! lista.get(i).getCanceledRequest())){
				++cont;
				java.lang.System.out.println(cont + " - " + lista.get(i).toString());
				listaAux.add(lista.get(i));
			}
		}
		Scanner sc = new Scanner(java.lang.System.in);
		java.lang.System.out.println("Digite qual pedido em Andamento voce deseja requisitar a Devolucao: ");
		String opcao = sc.nextLine();
		try {
			usuario.requestDevolution(lista.get(Integer.parseInt(opcao)).getRequestId());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void localizarUsuario(String login, String palavraChave,
			String atributo) {
		List<String> listaDeUsuariosEncontrados = new ArrayList<String>();

		try {
			listaDeUsuariosEncontrados = System.getInstance().searchUser(
					System.getInstance().getUser(login).getIdSession(),
					palavraChave, atributo);
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < listaDeUsuariosEncontrados.size(); i++) {
			java.lang.System.out.println(i + 1 + " - "
					+ listaDeUsuariosEncontrados.get(i));
		}

		Scanner sc = new Scanner(java.lang.System.in);
		java.lang.System.out.println("Deseja visualizar alguem? (S/N): ");
		String opcao = sc.nextLine();

		if (opcao.equalsIgnoreCase("S")) {
			java.lang.System.out.println("Numero do usuario (na lista): ");
			int numero = sc.nextInt();
			visualizarPerfilDeOutroUsuario(login,
					listaDeUsuariosEncontrados.get(numero - 1));
		}

	}

	private static void cadastrarItens(String login) {
		User usuario = null;
		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		String nome, descricao, categoria = null;
		Scanner sc = new Scanner(java.lang.System.in);

		java.lang.System.out.println("Digite o nome do item: ");
		nome = sc.nextLine();
		java.lang.System.out.println("Digite a descricao do item: ");
		descricao = sc.nextLine();
		java.lang.System.out.println("Digite a(s) categoria(s) do item: ");
		java.lang.System.out.println("Ex: Filme, Drama");
		categoria = sc.nextLine();
		
		try {
			usuario.addItem(System.getInstance().createItem(login, nome,
					descricao, categoria));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private static void visualizarPerfil(String login) {
		String opcao = null;
		Scanner sc = new Scanner(java.lang.System.in);

		do {
			java.lang.System.out.print("Bem vindo! \n"
					+ "Digite o que deseja visualizar: \n"
					+ "1 - Dados cadastrais\n" + "2 - Itens\n"
					+ "3 - Lista de amigos\n" + "0 - Para sair\n");
			opcao = sc.nextLine();

			if (opcao.equals("1")) {
				dadosCadastrais(login);
			} else if (opcao.equals("2")) {
				listaDeItens(login);
			} else if (opcao.equals("3")) {
				listaDeAmigos(login);
			}

		} while (!opcao.equals("0"));
	}

	private static void listaDeAmigos(String login) {
		User usuario = null;
		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < usuario.getFriendList().size(); i++) {
			java.lang.System.out.println(i + 1 + " - "
					+ usuario.getFriendList().get(i));
		}

		Scanner sc = new Scanner(java.lang.System.in);
		java.lang.System.out
				.println("Deseja visualizar o perfil de algum amigo? (S/N): ");
		String opcao = sc.nextLine();

		if (opcao.equalsIgnoreCase("S")) {
			java.lang.System.out.println("Numero do amigo (na lista): ");
			int numero = sc.nextInt();
			visualizarPerfilDeOutroUsuario(login,
					usuario.getFriendList().get(numero - 1));
		}

	}

	private static void listaDeItens(String login) {
		User usuario = null;
		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < usuario.getItemList().size(); i++) {
			java.lang.System.out.println(i + 1 + " - "
					+ usuario.getItemList().get(i).getName());
		}

	}

	private static void dadosCadastrais(String login) {
		User usuario = null;
		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		java.lang.System.out.println("Nome: " + usuario.getName()
				+ "\nLogin: \n" + usuario.getLogin() + "Endereco: "
				+ usuario.getNewAddress());

	}

	private static void visualizarPerfilDeOutroUsuario(String login,
			String loginOutroUsuario) {
		User usuarioAtual = null;
		try {
			usuarioAtual = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		try {
			if (usuarioAtual.isFriend(loginOutroUsuario)) {
				java.lang.System.out.println("--- Dados cadastrais ---");
				dadosCadastrais(loginOutroUsuario);
				java.lang.System.out.println("--- Lista de Amigos de "
						+ loginOutroUsuario + " ---");
				listaDeAmigos(loginOutroUsuario);
				java.lang.System.out.println("--- Lista de Itens de "
						+ loginOutroUsuario + " ---");
				listaDeItens(loginOutroUsuario);

				Scanner sc = new Scanner(java.lang.System.in);
				java.lang.System.out
						.println("Deseja pedir algum item emprestado (S/N)? ");
				String escolha = sc.nextLine();
				if (escolha.equalsIgnoreCase("S")) {
					java.lang.System.out
							.println("Qual o numero do item na lista? ");
					Scanner sc1 = new Scanner(java.lang.System.in);
					int opcao = sc1.nextInt();
					java.lang.System.out.println("Qual o numero de dias? ");
					int dias = sc.nextInt();
					User usuario2 = null;
					try {
						usuario2 = System.getInstance().getUser(
								loginOutroUsuario);
					} catch (Exception e) {
						e.printStackTrace();
					}
					String itemId = null;
					pedirItemEmprestado(login, loginOutroUsuario, itemId, dias);
				}

			} else {
				java.lang.System.out.println("--- Dados cadastrais ---");
				dadosCadastrais(loginOutroUsuario);
				java.lang.System.out.println("--- Lista de Amigos de "
						+ loginOutroUsuario + " ---");
				listaDeAmigos(loginOutroUsuario);
				Scanner sc = new Scanner(java.lang.System.in);
				String opcao = "";
				java.lang.System.out.println("Deseja adicionar " + login
						+ " como amigo? (S/N) ");
				opcao = sc.nextLine();
				if (opcao.equalsIgnoreCase("S")) {
					adicionaAmigo(login, loginOutroUsuario);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private static void adicionaAmigo(String login, String loginOutroUsuario) {
		User usuarioAtual = null;
		try {
			usuarioAtual = System.getInstance().getUser(login);
			usuarioAtual.requestFriendShip(loginOutroUsuario);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void rankingUsuarios(String login) {

		User usuario = null;
		Scanner sc = new Scanner(java.lang.System.in);
		String opcao;
		List<RankedUser> globalRanking;
		List<RankedUser> friendRanking;

		int cont = 1;

		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		java.lang.System.out.println("Digite 1 para ranking de amigos\n"
				+ "Digite 2 para ranking geral: ");
		opcao = sc.nextLine();

		if (opcao.equals("1")) {
			try {

				friendRanking = System.getInstance().getFriendsRanking(usuario);
				for (RankedUser c : friendRanking) {
					java.lang.System.out.println(cont + " " + c.getLogin()
							+ "\n");
					cont++;
				}

			} catch (Exception e) {
				e.printStackTrace();
			}
		} else if (opcao.equals("2")) {
			globalRanking = System.getInstance().getGlobalRanking();

			for (RankedUser c : globalRanking) {
				java.lang.System.out.println(cont + " " + c.getLogin() + "\n");
				cont++;
			}

		} else {
			java.lang.System.out.println("opcao invalida");
		}
	}

	private static void amizadesPendentes(String login) {

		User usuario = null;
		List<Request> requisicoesAmizades = null;

		try {
			usuario = System.getInstance().getUser(login);
			requisicoesAmizades = usuario.getfriendshipRequestList();
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < requisicoesAmizades.size(); i++) {
			java.lang.System.out.println(i + 1 + " - "
					+ requisicoesAmizades.get(i).getRequestingUser());
		}

		Scanner sc = new Scanner(java.lang.System.in);
		int opcao = -1;
		String escolha = "";

		do {
			java.lang.System.out
					.print("Para escolher pedido de amizade, digite o numero de uma requisicao: \n");
			opcao = sc.nextInt();
			java.lang.System.out
					.println("Para aceitar solicitacao digite S, para recusar digite N: ");
			escolha = sc.nextLine();

			if (escolha.equalsIgnoreCase("S")) {
				try {
					usuario.aproveFriendRequest(requisicoesAmizades.get(
							opcao - 1).getRequestingUser());
				} catch (Exception e) {
					e.printStackTrace();
				}
			} else if (escolha.equalsIgnoreCase("N")) {
				try {
					usuario.removefriendshipRequest(opcao - 1);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

		} while (opcao != 0);

	}

	private static void pedirItemEmprestado(String login,
			String loginOutroUsuario, String itemId, int days) {
		User usuario = null;
		try {
			usuario = System.getInstance().getUser(login);
			usuario.requestItem(loginOutroUsuario, itemId, days);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void aceitarRequisicoesDeItens(String login) {
		User usuario = null;
		List<RequestItem> requisicoesItens = null;

		try {
			usuario = System.getInstance().getUser(login);
			requisicoesItens = usuario.getPendingRequestList();
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < requisicoesItens.size(); i++) {
			java.lang.System.out.println(i + 1 + " - "
					+ requisicoesItens.get(i).getNameOfProduct());
		}

		Scanner sc = new Scanner(java.lang.System.in);
		int opcao = -1;
		String escolha = "";

		java.lang.System.out.println("Deseja aceitar alguma requisicao? (S/N)");
		escolha = sc.nextLine();

		if (escolha.equalsIgnoreCase("S")) {
			java.lang.System.out.println("Numero da requisicao: ");
			opcao = sc.nextInt();
			try {
				usuario.aproveRequestItem(requisicoesItens.get(opcao - 1)
						.getRequestId());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	private static void desfazerAmizade(String login) {
		User usuario = null;
		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < usuario.getFriendList().size(); i++) {
			java.lang.System.out.println(i + 1 + " - "
					+ usuario.getFriendList().get(i));
		}

		Scanner sc = new Scanner(java.lang.System.in);
		java.lang.System.out.println("Indice do amigo que deseja excluir: ");
		int opcao = sc.nextInt();
		try {
			usuario.undoFriendShip(usuario.getFriendList().get(opcao));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void removerItem(String login) {
		User usuario = null;
		try {
			usuario = System.getInstance().getUser(login);
		} catch (Exception e) {
			e.printStackTrace();
		}

		listaDeItens(login);
		Scanner sc = new Scanner(java.lang.System.in);
		java.lang.System.out.println("Indice do item que deseja excluir: ");
		int opcao = sc.nextInt();
		try {
			usuario.deleteItem(usuario.getItemList().get(opcao));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
